function ajax(opt, kind) {
    // 引入默认值其中type,header都有默认值，如果实参中没有设置则使用默认值
    var defaults = {
        type: 'get',
        url: '',
        data: {},
        header: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        success: function () { },
        error: function () { }
    }
    // 使用opt覆盖defaults中的元素
    Object.assign(defaults, opt);
    // 创建AJAX对象
    var xhr = new XMLHttpRequest();
    // 创建一个formdata对象
    var formdata = new FormData();
    // 将所需要的参数加入对象，第一个参数为请求参数名，第二个参数为请求参数值
    // 遍历参数对象中数据的各个属性及属性值
    if (kind == "normal") {
        var strings = "";
        for (var attr in defaults.data) {
            if (Array.isArray(defaults.data[attr])) {
                for (var i in defaults.data[attr]) {
                    formdata.append(attr, defaults.data[attr][i]);
                }
            } else {
                formdata.append(attr, defaults.data[attr]);
            }
            strings += attr + '=' + defaults.data[attr] + '&';;
        }
        strings = strings.substr(0, strings.length - 1);
        if (defaults.type == 'get' && attr) {
            defaults.url = defaults.url + "?" + strings;
        }
    }
    else {
        var strings = "";
        for (var attr in defaults.data) {
            if (Array.isArray(defaults.data[attr])) {
                for (var i in defaults.data[attr]) {
                    formdata.append(attr, defaults.data[attr][i]);
                }
            } else {
                formdata.append(attr, defaults.data[attr]);
            }
            strings += "/"+defaults.data[attr];
        }
        if (defaults.type == 'get' && attr) {
            defaults.url = defaults.url + strings;
        }
    }
    // 配置ajax对象
    xhr.open(defaults.type, defaults.url);
    if (defaults.type == 'post') {
        // 发送formdata类型的数据
        xhr.send(formdata);
    } else {
        // 当请求方式为 get 时，send() 函数传递的是空参
        xhr.send();
    }
    // xhr对象下的Onload事件，当xhr对象接收完响应数据后触发
    xhr.onload = function () {
        // 获取服务器响应返回的数据类型
        var contentType = xhr.getResponseHeader('Content-Type');
        // 存储响应报文
        var responseText = xhr.responseText;
        // 如果服务器返回的是JSON字符串，则将其返回成JSON对象 
        if (contentType.includes('application/json')) {
            responseText = JSON.parse(responseText);
        }
        // 当返回状态码为200即响应成功时调用的函数，参数中包 含xhr对象的原因：可以通过返回的xhr中的各种信息如状态码之类的分析失败原因
        if (xhr.status == 200) {
            defaults.success(responseText, xhr);
        } else {
            // 当响应失败时调用的函数
            defaults.error(responseText, xhr)
        }
    }
}
// 函数调用时的例子，其中type和header拥有默认值，可以不进行输入
// ajax({
//     // 请求方式
//     type: 'post',
//     // 请求路径
//     url: 'http://127.0.0.1:8000/server',
//     // 请求时传递的参数
//     data:{
//         name: ajax,
//         age: 20 
//     },
//     // 请求的数据类型
//     header:{
//         'Content-Type':'application/x-www-form-urlencoded'
//     },
//     // 请求成功时调用的函数
//     success: function (data) {
//         // 函数体
//     }
// })